#!/usr/bin/python
# -*- coding: utf-8 -*-

#$ -l h_rt=2:00:00
#$ -l virtual_free=100M
#$ -l arch='*'
#$ -o $HOME/refreshnews.out
#$ -e $HOME/refreshnews.err
#$ -N refreshnews

import sys
sys.path.append('/home/artem/pywikipedia')
#sys.path.append('/home/artem/Dropbox/wiki/bot/pywikipedia')

import re

import wikipedia
import catlib
import query

import gzip

import datetime

def MonthName(m):
	if m == 1:
		return 'января'
	elif m == 2:
		return 'февраля'
	elif m == 3:
		return 'марта'
	elif m == 4:
		return 'апреля'
	elif m == 5:
		return 'мая'
	elif m == 6:
		return 'июня'
	elif m == 7:
		return 'июля'
	elif m == 8:
		return 'августа'
	elif m == 9:
		return 'сентября'
	elif m == 10:
		return 'октября'
	elif m == 11:
		return 'ноября'
	elif m == 12:
		return 'декабря'

def getPageId(title):
	params = {'action': 'query', 'titles': title}
	response = query.GetData(params, site)
		
	return response['query']['pages'].keys()[0]

def getTitle(pageid):
	params = {'action': 'query', 'pageids': pageid}
	response = query.GetData(params, site)
		
	return response['query']['pages'][pageid]['title']

def getOldList():
	id_list = []
	f = gzip.open('tmp/pubartid.gz')
	for line in f:
		id_list.append(line.decode('utf8').replace('\n', ''))
	f.close()
	return id_list

def getNewList(site):
	blacklist = []
	for page in catlib.Category(site, u'Категория:Не публиковать').articles():
		blacklist.append(page)
	for page in catlib.Category(site, u'Категория:Редактируется').articles():
		blacklist.append(page)
	
	id_list = []
	for page in catlib.Category(site, u'Категория:Опубликовано').articles():
		if page not in blacklist:
			id_list.append(getPageId(page.title()))
	return id_list

def saveNewList(id_list):
	f = gzip.open('tmp/pubartid.gz', 'wb')
	for pageid in id_list:
		f.write(pageid.encode('utf8') + '\n')
	f.close()
	
def StableId(site, pageid):
	params = {'action': 'query', 'pageids': pageid, 'prop' : 'flagged'}
	response = query.GetData(params, site)
	
	try:
		return response['query']['pages'][pageid]['flagged']['stable_revid']
	except KeyError:
		return -1

def Published(title):
	ret = False
	pageid = getPageId(title)
	for page in catlib.Category(site, u'Категория:Опубликовано').articles():
		if getPageId(page.title()) == pageid:
			ret = True
			break
			
	return ret

def getDictOfPublishedArticles(site):
	list_of_pages = catlib.Category(site, u'Категория:Опубликовано').articlesList()
	
	titles = ""
	titles_and_stable_ids = {}
	i = 0
	for page in list_of_pages:
		titles += page.title() + u"|"
		i+=1
		if i == 10:
			titles_and_stable_ids.update(StableIds(site, titles))
			i = 0
			titles = ""
	
	return titles_and_stable_ids

def UpdateRSS(site, title, stable_revid):
	print 'Updating RSS'
	#import xml.etree.ElementTree as etree
	import urllib
	import lxml.etree as etree
	
	page = wikipedia.Page(site, title)
	
	xml = etree.ElementTree()
	xml.parse('/home/artem/public_html/ru_wikinews_rss.xml')
	rss = xml.getroot()[0]
	
	item = etree.Element('item')
	item.append(etree.Element('title'))
	item[0].text = page.title()
	item.append(etree.Element('link'))
	item[1].text = u'http://ru.wikinews.org/w/index.php?title=' + page.urlname() + u'&oldid=' + stable_revid
	
	item.append(etree.Element('guid'))
	item[2].text = u'http://ru.wikinews.org/w/index.php?title=' + page.urlname() + u'&oldid=' + stable_revid
	
	content = wikipedia.removeDisabledParts(page.get())
	content = wikipedia.removeLanguageLinks(content)
	content = wikipedia.removeCategoryLinks(content)
#	print content
	content = re.sub('__.+__', '', content)
#	print content
	content = re.sub(u'<ref>.+</ref>', '', content, flags=re.DOTALL)
#	print content
	content = re.sub('{{.+?}}', '', content, flags=re.DOTALL)
#	print content
	content = re.sub('{\|.+?\|}', '', content, flags=re.DOTALL)
#	print content
	content = re.sub(u'\[\[(Файл|File|Image).+\]\]', '', content)
#	print content
	content = re.sub('\[\[[^]]+?\|', '', content)
#	print content
	content = re.sub('\[', '', content)
#	print content
	content = re.sub('\]', '', content)
#	print content
	content = re.sub(u'== Источники.+', '', content, flags=re.DOTALL)
#	print content
	item.append(etree.Element('description'))
#	print content.lstrip()
#	text = ""
#	for string in content.lstrip().splitlines():
#		text += string + u'<br/>'
	item[3].text = content.lstrip().splitlines()[0]
	try:
		image_URL = page.imagelinks()[0].fileUrl()
#		item[2].append(etree.Element('img', attrib={'src': image_URL, 'height': "200"}))
	except IndexError:
		print "No images found"
	
	item.append(etree.Element('pubDate'))
	item[4].text = datetime.datetime.utcnow().strftime('%a, %d %b %Y %H:%M:%S GMT')
	
	item.append(etree.Element('comments'))
	item[5].text = u'http://ru.wikinews.org/wiki/' + urllib.quote("Комментарии:") + page.urlname()
	
	rss.insert(7, item)
	
	rss.find('lastBuildDate').text = datetime.datetime.utcnow().strftime('%a, %d %b %Y %H:%M:%S GMT')
	rss.remove(rss.findall('item')[len(rss.findall('item'))-1])
	xml.write('/home/artem/public_html/ru_wikinews_rss.xml', xml_declaration=True, pretty_print=True)
	#print etree.tostring(xml, xml_declaration=True, pretty_print=True)
	
	rss_page = wikipedia.Page(site, u'Викиновости:RSS-поток')
	rss_page.put(etree.tostring(xml, xml_declaration=True, pretty_print=True), comment=u'Автоматическое обновление RSS-потока', sysop=True)

def UpdateTemplate(title):
	print 'Updating Template'
	
	wpsite = wikipedia.getSite('ru', 'wikipedia')
	page = wikipedia.Page(wpsite, u'Шаблон:Актуальные Викиновости/Список')
	old_content = page.get()
	items = re.findall('\*.+', old_content)
	items.pop()
	items.insert(0, u"* {{news|" + title + u"}}")
	
	new_content = u"<noinclude><div style=\"color:#000; background-color:#faa; font-size:120%;\">Этот список обновляется автоматически ботом {{u|AKBot}}. Пожалуйста, во избежание дублирования не добавляйте сюда ссылки вручную!</div></noinclude>\n"
	for item in items:
		new_content += item + "\n"
	
	page.put(new_content, comment=u'Автоматическое обновление списка актуальных викиновостей')
	
	return 0

def Purge(titles):
	import query
	params = {'action':'purge', 'titles':titles}
	print query.GetData(params, encodeTitle = False)

site = wikipedia.getSite()

#dict_new = getDictOfPublishedArticles(site)

list_old = getOldList()
list_new = getNewList(site)

for pageid in list_new:
	if pageid not in list_old:
		print pageid.encode('utf8')
		title = getTitle(pageid)
		print title.encode('utf8')
		stable_revid = StableId(site, pageid)
		print stable_revid
		if stable_revid > 0:
			UpdateRSS(site, title, str(stable_revid))
			UpdateTemplate(title)
			list_old.append(pageid)
			print 'Updated!'
		else:
			print 'Not yet published.'

saveNewList(list_old)

date = datetime.date.today()
Purge('Заглавная страница|Викиновости:Новости за последние 45 дней|Категория:' + str(date.day) + ' ' + MonthName(date.month))

wikipedia.stopme()
